/**
 * 设计循环队列:
 * 1. 使用usedSize
 * 2. 浪费一个空间
 */

public class MyCircularQueue{
    public int[] elem;
    public int usedSize;// 有效个数
    public int front;
    public int rear;

    public MyCircularQueue(int k){
        this.elem = new int[k+1];
    }

    /**
     * 入队
     * 如果需要扩容,就需要考虑从哪里开始拷贝
     * @param val
     * @return
     */
    public boolean enQueue(int val){
        if (!isFull()){
            elem[rear] = val;
            rear = (rear+1) % elem.length;
            return true;
        }else{
            return false;
        }
    }

    /**
     * 出队
     * @return
     */
    public boolean deQueue(){
        if (isEmpty()){
            return false;
        }else {
            front = (front+1) % elem.length;
            return true;
        }
    }

    /**
     * 获取队头元素
     * @return
     */
    public int Front(){
        if (isEmpty()){
            return -1;
        }else {
            return elem[front];
        }
    }

    /**
     * 获取队尾元素
     * 注意下标: 0和elem.length的时候
     * @return
     */
    public int Rear(){
        if (isEmpty()){
            return -1;
        }
        return (rear == 0) ? elem[elem.length-1] : elem[rear-1];
    }
    /**
     * 判断当前队列是否满了
     * @return
     */
    public boolean isFull(){
        /*if (usedSize == elem.length){
            return true;
        }
        return false;*/

        return (rear+1) % elem.length == front;
    }

    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isEmpty(){
        /*if (usedSize == 0){
            return true;
        }
        return false;*/

        return rear == front;
    }
}
